<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
<script>
    //portotype 与 _proto_
    //显示原型(prototype)
    //每一个函数在创建后 都会拥有一个名为prototype的属性 这个属性指向函数的原型 (用访问函数的原型对象)
    //_proto_
    //隐式原型 
    //js中任意对象都有一个 内置属性prototype


    //代码示例 ？
// function Test(){
//     const test = new Test();
// }
// test._proto_ === Test.prototype; //true
    //即构造函数 拥有prototype属性 对象实例 拥有_proto_属性 他们都是用来访问原型对象的  
    //函数一个特点 它不仅是函数 还是一个对象 所以它也有_proto_属性 



    //摘自博客
    /*什么是原型讷？
    > 我们创建每一个函数 都有一个prototype(原型) 属性
    > 这个属性是一个指针 指向一个对象 
    > 而这个对象的作用是 存放这个类型创建的所有实例共享的属性和方法 
    > 指向这个对象 就是我们所谓的原型对象  

     *原型对象的作用 
    >使用的好处是 可以让所有对象实例共享它所包含的属性和 方法 
    >换句话说 不必在构造函数中定义对象实例的信息 而是将信息直接添加至原型对象上  
   3 代码案例如下 
    */

    //创建对象的构造函数 
    function Person(){
        //通过原型对象来设置一些属性和值 
        Person.prototype.name ="changDongDong"
        Person.prototype.age = 18
        Person.prototype.height = 1.88
        Person.prototype.sayHellow = function(){
            alert(this.name)
    }
    //创建俩对象实例 并且调用方法
    }
    var person1 = new Person()
    var person2 = new Person()
    person1.sayHellow();     //changDongDong
    person2.sayHellow();     //changDongDong
    /*
    > 在上面代码中 没有给实例对象单独设置属性和方法 而是直接设置给了原型对象 
    > 而原型对象的作用 是可以让所有的对象来共享 这些属性 和方法
    > 因此 调用sayHellow()方法时 他们打印出的一样 他们是共享的  
    */



    //深入原型对象 
    /*
    //原型对象的创建 
    > 无论社么时候 只要创建一个新函数 就会根据 一组特定的规则 为该函数创建一个prototype属性 这个属性指向函数的原型对象
    //原型上的constructor 
    > 默认情况下 所有原型对象都会自动获得一个constructor(构造函数)属性 这个属性包含一个指向prototype属性所在函数的指针
    */

    /*
        当调用构造函数创建一个新的实例后 该实例的内部将包含一个内部属性 该属性的指针指向构造函数的原型对象 
        这个属性就是 _proto_
    */

</script>
